package hz.mobileproject.pda.toolsmanager.activity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;

import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import hz.mobileproject.pda.R;
import hz.mobileproject.pda.app.MainApp;
import hz.mobileproject.pda.entity.response.Response_loadPoliceInfo;
import hz.mobileproject.pda.entity.response.Response_login_user;
import hz.mobileproject.pda.entity.response.Rp_loadPrisonerInfo;
import hz.mobileproject.pda.listener.CustomNetCallBack;
import hz.mobileproject.pda.network.Constance;
import hz.mobileproject.pda.toolsmanager.adapter.ToolsGrantLVAdaper;
import hz.mobileproject.pda.toolsmanager.adapter.ToolsStockAdapter;
import hz.mobileproject.pda.toolsmanager.bean.request.RQ_ModifyToolStatus;
import hz.mobileproject.pda.toolsmanager.bean.response.RP_FreeCountTools;
import hz.mobileproject.pda.toolsmanager.bean.response.RP_StationInfo;
import hz.mobileproject.pda.toolsmanager.bean.response.RP_ToolInfo;
import hz.mobileproject.pda.toolsmanager.bean.response.RP_ToolSysSet;
import hz.mobileproject.pda.toolsmanager.utils.ToolCommonHttpUtils;
import hz.mobileproject.pda.ui.base.BaseActivity;
import hz.mobileproject.pda.ui.base.BaseScanActivity;
import hz.mobileproject.pda.utils.HttpRqUtils;

@ContentView(R.layout.activity_tools_grant)
public class ToolsGrantActivity extends BaseScanActivity {
    @ViewInject(R.id.lv_tools_grant)
    private ListView lv_tools_grant;
    @ViewInject(R.id.tv_prisonerName)
    private TextView tv_prisonerName;
    @ViewInject(R.id.tv_workPosition)
    private TextView tv_workPosition;
    @ViewInject(R.id.lv_tools_stock)
    private ListView lv_tools_stock;

    private Gson mGson;
    private ToolsGrantLVAdaper mToolsGrantLVAdaper;
    private ToolsStockAdapter mToolsStockAdapter;
    private RP_ToolSysSet mToolSystemSet;
    //当前民警信息
    private Response_loadPoliceInfo mPoliceInfo;
    //当前扫码罪犯
    private Rp_loadPrisonerInfo mPrisoner;
    //当前扫描工位
    private RP_StationInfo mStation;
    private Set<String> mAlreadyGrantTools;

    private static final int REQUEST_CODE_POLICE = 0x1011;
    private static final int REQUEST_CODE_PRISONER = 0x1012;
    private static final int REQUEST_CODE_WORK_POSITION = 0x1013;
    private static final int REQUEST_CODE_TOOLS = 0x1014;

    @Override
    protected void initData() {
        setTitleText("工具发放");
        mGson = new Gson();
        mToolsGrantLVAdaper = new ToolsGrantLVAdaper(this, new ArrayList<RP_ToolInfo>());
        lv_tools_grant.setAdapter(mToolsGrantLVAdaper);

        mToolsStockAdapter = new ToolsStockAdapter(this, new ArrayList<RP_FreeCountTools>());
        lv_tools_stock.setAdapter(mToolsStockAdapter);

        mToolSystemSet = (RP_ToolSysSet) getIntent().getSerializableExtra("key");
        mAlreadyGrantTools = new HashSet<>();
        //扫描民警
        scanPolice();
    }

    @Override
    protected void onScanSucesess(int requestCode, String scanMsg) {
        LogUtils.e(scanMsg);
        switch (requestCode) {
            case REQUEST_CODE_POLICE:
                getPliceInfoFromSer(scanMsg);
                break;
            case REQUEST_CODE_PRISONER:
                getPrisonerInfoFromSer(scanMsg);
                break;
            case REQUEST_CODE_WORK_POSITION:
                getWorkPositionInfoFromSer(scanMsg);
                break;
            case REQUEST_CODE_TOOLS:
                getToolInfoFromSer(scanMsg);
                break;
        }
    }

    @Event({R.id.btn_tools_grant_next, R.id.btn_tools_grant_complete})
    private void onViewClick(View v){
        switch (v.getId()) {
            case R.id.btn_tools_grant_next:
                modifyToolStatus(R.id.btn_tools_grant_next);
                break;
            case R.id.btn_tools_grant_complete:
                modifyToolStatus(R.id.btn_tools_grant_complete);
                break;
        }
    }


    /**
     * 请求网络接口获取民警信息
     *
     * @param scanStr
     */
    private void getPliceInfoFromSer(String scanStr) {
        ToolCommonHttpUtils.getPoliceInfoFromSer(scanStr, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                LogUtils.e(data);
                Response_loadPoliceInfo loadPoliceInfo = mGson.fromJson(data, Response_loadPoliceInfo.class);
                if (loadPoliceInfo == null) {
                    ToastUtils.showLong("民警信息为空");
                    return;
                }
                mScanLoadingDialog.dismiss();
                mPoliceInfo = loadPoliceInfo;
                setTitleText(mPoliceInfo.getPolice_name());
                //获取库存信息
                getFreeToolsCountFromSer();
                //打开扫描
                scanAfterPolice();
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("获取民警信息失败");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("获取民警信息失败");
                LogUtils.e(ex);
            }
        });
    }



    /**
     * 请求网络接口获取罪犯信息
     *
     * @param scanStr
     */
    private void getPrisonerInfoFromSer(String scanStr) {
        ToolCommonHttpUtils.getPrisonerInfoFromSer(scanStr, mPoliceInfo, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                LogUtils.e(data);
                Rp_loadPrisonerInfo loadPrisonerInfo = mGson.fromJson(data, Rp_loadPrisonerInfo.class);
                if (loadPrisonerInfo == null) {
                    ToastUtils.showLong("罪犯信息为空");
                    return;
                }
                mScanLoadingDialog.dismiss();
                mPrisoner = loadPrisonerInfo;
                tv_prisonerName.setText(mPrisoner.getPrisoner_name());
                scanAfterPrison();
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("获取罪犯信息失败");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("获取罪犯信息失败");
                LogUtils.e(ex);
            }
        });
    }


    /**
     * 请求网络接口获取库存信息
     */
    private void getFreeToolsCountFromSer() {
        ToolCommonHttpUtils.getFreeToolsCountFromSer(mPoliceInfo, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                LogUtils.e(data);
                List<RP_FreeCountTools> tempList = mGson.fromJson(data, new TypeToken<ArrayList<RP_FreeCountTools>>() {
                }.getType());
                mToolsStockAdapter.clearAdd(tempList);
                if (tempList == null || tempList.size() == 0) {
                    ToastUtils.showLong("库存信息为空");
                }
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("获取库存信息失败(" + rtnCode + "," + rtnMsg + ")");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("获取库存信息失败");
                LogUtils.e(ex);
            }
        });
    }


    /**
     * 请求网络接口获取工位信息
     *
     * @param scanStr
     */
    private void getWorkPositionInfoFromSer(String scanStr) {
        ToolCommonHttpUtils.getWorkStationInfoFromSer(scanStr,mToolSystemSet,mPoliceInfo, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                LogUtils.e(data);
                RP_StationInfo stationInfo = mGson.fromJson(data, RP_StationInfo.class);
                if (stationInfo == null) {
                    ToastUtils.showLong("工位信息格式错误或为空");
                    return;
                }
                mScanLoadingDialog.dismiss();
                mStation = stationInfo;
                tv_workPosition.setText(stationInfo.getStation_name());
                scanTools();
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("获取工位信息失败(" + rtnCode + "," + rtnMsg + ")");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("获取工位信息失败");
                LogUtils.e(ex);
            }
        });
    }


    /**
     * 请求网络接口获取工具信息
     *
     * @param scanStr
     */
    private void getToolInfoFromSer(String scanStr) {
        ToolCommonHttpUtils.getToolInfoFromSer(scanStr,mToolSystemSet,mPoliceInfo, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                LogUtils.e(data);
                RP_ToolInfo toolInfo = mGson.fromJson(data, RP_ToolInfo.class);
                if (toolInfo == null) {
                    ToastUtils.showLong("工具信息格式错误或为空");
                    return;
                }
                //判断工具是否分配到本部门
                if(!toolInfo.getDprt_id().equals(mPoliceInfo.getDepartment_id()+"")){
                    ToastUtils.showLong("此工具不属于当前部门");
                    return;
                }
                //判断工具是否报废
                if(toolInfo.getStatus() == RP_ToolInfo.STATUS_SCRAP){
                    ToastUtils.showLong("此工具已被报废");
                    return;
                }
                //判断此工具是否发放
                if (toolInfo.getSf_status() == RP_ToolInfo.SF_STATUS_GRANTED) {
                    ToastUtils.showLong("此工具已被发放");
                    return;
                }
                //判断此工具是否已在发放列表
                if(mAlreadyGrantTools.contains(toolInfo.getTool_id())){
                    ToastUtils.showLong("此工具已存在列表中");
                    return;
                }
                mAlreadyGrantTools.add(toolInfo.getTool_id());
                mToolsGrantLVAdaper.add(toolInfo);
                lv_tools_grant.setSelection(mToolsGrantLVAdaper.getCount());
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("获取工具信息失败(" + rtnCode + "," + rtnMsg + ")");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("获取工具信息失败");
                LogUtils.e(ex);
            }
        });
    }

    /**
     * 请求网络接口提交发放
     */
    private void modifyToolStatus(final int viewID) {
        if(mPoliceInfo == null){
            ToastUtils.showLong("请先获取民警信息");
            return;
        }
        switch (mToolSystemSet.getGive_object()){
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION:
                if(mStation == null){
                    ToastUtils.showLong("请先获取工位信息");
                    return;
                }
                break;
            case RP_ToolSysSet.TSS_GIVE_OBJECT_PERSON:
                if(mPrisoner == null){
                    ToastUtils.showLong("请先获取使用人信息");
                    return;
                }
                break;
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION_PERSON:
                if(mStation == null){
                    ToastUtils.showLong("请先获取工位信息");
                    return;
                }
                if(mPrisoner == null){
                    ToastUtils.showLong("请先获取使用人信息");
                    return;
                }
                break;
        }
        if(mToolsGrantLVAdaper.getCount() <= 0){
            ToastUtils.showLong("请扫描发放工具");
            return;
        }
        List<RQ_ModifyToolStatus> modifyToolStatusList = new ArrayList<>();
        for(int i=0;i<mToolsGrantLVAdaper.getCount();i++){
            RP_ToolInfo item = mToolsGrantLVAdaper.getItem(i);

            RQ_ModifyToolStatus modifyToolStatus = new RQ_ModifyToolStatus();
            modifyToolStatus.setCus_number(mPoliceInfo.getCus_number());
            modifyToolStatus.setDprt_id(mPoliceInfo.getDepartment_id());
            modifyToolStatus.setDprt_name(mPoliceInfo.getDepartment_name());
            modifyToolStatus.setManage_person_id(mPoliceInfo.getPolice_id());
            modifyToolStatus.setManage_person_name(mPoliceInfo.getPolice_name());
            if(mStation != null){
                modifyToolStatus.setStation_id(mStation.getStation_id());
                modifyToolStatus.setStation_name(mStation.getStation_name());
            }
            if(mPrisoner != null){
                modifyToolStatus.setUse_person_id(mPrisoner.getPrisoner_id());
                modifyToolStatus.setUse_person_name(mPrisoner.getPrisoner_name());
            }
            modifyToolStatus.setType(RQ_ModifyToolStatus.TYPE_GRANT);
            modifyToolStatus.setTool_id(item.getTool_id());
            modifyToolStatus.setTool_name(item.getTool_name());
            modifyToolStatus.setTool_type(item.getTool_type()+"");
            modifyToolStatus.setSf_status(RP_ToolInfo.SF_STATUS_GRANTED);

            modifyToolStatusList.add(modifyToolStatus);
        }

        HttpRqUtils.httpPost(Constance.BASE_URL + Constance.URL_TOOL_MODIFY_TOOL_STATUS, modifyToolStatusList, new CustomNetCallBack() {
            @Override
            public void onSuccessFromSer(int rtnCode, String rtnMsg, String data) {
                switch (viewID) {
                    case R.id.btn_tools_grant_next:
                        ToastUtils.showLong("发放提交成功");
                        //TODO 清空本页面的信息
                        tv_prisonerName.setText("");
                        mPrisoner = null;
                        tv_workPosition.setText("");
                        mStation = null;
                        mToolsGrantLVAdaper.deleteAll();
                        scanAfterPolice();
                        //重新获取库存
                        getFreeToolsCountFromSer();
                        break;
                    case R.id.btn_tools_grant_complete:
                        new AlertDialog.Builder(ToolsGrantActivity.this).setTitle("提示")
                                .setMessage("发放提交成功，本页面将关闭")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        ToolsGrantActivity.this.finish();
                                    }
                                }).setCancelable(false).create().show();
                        break;
                }
            }

            @Override
            public void onErrorFromSer(int rtnCode, String rtnMsg) {
                ToastUtils.showLong("发放提交失败(" + rtnCode + "," + rtnMsg + ")");
            }

            @Override
            public void onErrorFromNet(Throwable ex, boolean isOnCallback) {
                ToastUtils.showLong("发放提交失败");
                LogUtils.e(ex);
            }
        });
    }


    /**
     * ====================================扫描流程=========================================
     */
    private void scanPolice() {
        //是否需要扫描民警
        if (RP_ToolSysSet.TSS_CALL_TYPE_SCAN_USER == mToolSystemSet.getCall_type()) {
            //扫民警
            openScan(REQUEST_CODE_POLICE, mToolSystemSet, "请扫描民警条码");
        } else if (RP_ToolSysSet.TSS_CALL_TYPE_LOGIN_USER == mToolSystemSet.getCall_type()) {
            //使用登录民警信息
            mPoliceInfo = new Response_loadPoliceInfo();
            Response_login_user loginUser = MainApp.getInstance().getLoginUser();
            mPoliceInfo.setCus_number(loginUser.getCus_number());
            mPoliceInfo.setDepartment_id(loginUser.getDepartment_id());
            mPoliceInfo.setDepartment_name(loginUser.getDepartment_name());
            mPoliceInfo.setPolice_code(loginUser.getPolice_code());
            mPoliceInfo.setPolice_id(loginUser.getPolice_id());
            mPoliceInfo.setPolice_name(loginUser.getPolice_name());
            //获取库存信息
            getFreeToolsCountFromSer();
            //接着扫描
            scanAfterPolice();
        }
    }

    private void scanAfterPolice() {
        //判断工具发放绑定方式
        switch (mToolSystemSet.getGive_object()) {
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION:
                //扫描扫描工位
                openScan(REQUEST_CODE_WORK_POSITION, mToolSystemSet, "请扫描工位");
                break;
            case RP_ToolSysSet.TSS_GIVE_OBJECT_PERSON:
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION_PERSON:
                //扫描使用人
                openScan(REQUEST_CODE_PRISONER, mToolSystemSet, "请扫描使用人");
                break;
        }
    }

    private void scanAfterPrison() {
        //判断工具发放绑定方式
        switch (mToolSystemSet.getGive_object()) {
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION:
            case RP_ToolSysSet.TSS_GIVE_OBJECT_PERSON:
                //请扫描工具
                scanTools();
                break;
            case RP_ToolSysSet.TSS_GIVE_OBJECT_WORKPOSITION_PERSON:
                //扫描扫描工位
                openScan(REQUEST_CODE_WORK_POSITION, mToolSystemSet, "请扫描工位");
                break;
        }
    }

    private void scanTools() {
        if (RP_ToolSysSet.TSS_SWEEP_TYPE_CAMERA == mToolSystemSet.getSweep_type()) {
            setTitleRightIcon(true, R.mipmap.scan_camera);
            getIv_title_right().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //请扫描工具
                    openScan(REQUEST_CODE_TOOLS, mToolSystemSet, "请扫描工具");
                }
            });
        }

        //请扫描工具
        openScan(REQUEST_CODE_TOOLS, mToolSystemSet, "请扫描工具");
    }

}
